﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace MSH.Common.WP7
{
    /// <summary>
    /// De klasse is verantwoordelijk voor het versturen van notificaties naar een WP7 telefoon
    /// </summary>
    public static class NotificationFactory
    {

        /// <summary>
        /// Maak een toast notificatie voor een vriend die binnen de aangegeven range komt
        /// </summary>
        /// <param name="friendUsername">Gebruikersnaam van de vriend</param>
        /// <returns>Notificatie met het bericht dat de vriend binnen de aangegeven afstand komt</returns>
        public static Notification PrepareToastFriendNotification(String friendUsername)
        {
            Notification notification = new Notification();
            notification.Type = NotificationType.Toast;

            XNamespace wp = "WPNotification";

            notification.Data = Encoding.UTF8.GetBytes(
                new XDocument(
                    new XDeclaration("1.0", "utf-8", "false")
                    , new XElement(wp + "Notification"
                        , new XElement(wp + "Toast"
                            , new XElement(wp + "Text1", "Friend location notification\n")
                            , new XElement(wp + "Text2", friendUsername+"\nentered your notification area")))).ToString());


            return notification;
        }

        /// <summary>
        /// Maken van een toast notificatie, waarmee een aanvraag voor een locatie update gedaan word.
        /// </summary>
        /// <returns>Notificatie met daarin het bericht om je locatie te updaten.</returns>
        public static Notification PrepareToastLocationUpdate()
        {
            Notification notification = new Notification();
            notification.Type = NotificationType.Toast;

            XNamespace wp = "WPNotification";

            notification.Data = Encoding.UTF8.GetBytes(
                new XDocument(
                    new XDeclaration("1.0", "utf-8", "false")
                    , new XElement(wp + "Notification"
                        , new XElement(wp + "Toast"
                            , new XElement(wp + "Text1", "Long time no see, where are you?")
                            , new XElement(wp + "Text2", "")))).ToString());


            return notification;
        }

        /// <summary>
        /// Maak een toast notificatie voor als er een nieuw chat bericht binnen komt
        /// </summary>
        /// <param name="sender">Zender van het bericht</param>
        /// <param name="message">Het bericht</param>
        /// <returns>Notificatie met daarin de zender en het bericht</returns>
        public static Notification PrepareToastChatMessage(String sender, String message)
        {
            Notification notification = new Notification();
            notification.Type = NotificationType.Toast;

            XNamespace wp = "WPNotification";
            message = String.Format("{0}: {1}", sender, message);

            notification.Data = Encoding.UTF8.GetBytes(
                new XDocument(
                    new XDeclaration("1.0", "utf-8", "false")
                    , new XElement(wp + "Notification"
                        , new XElement(wp + "Toast"
                            , new XElement(wp + "Text1", "New message")
                            , new XElement(wp + "Text2", message.Substring(0, Math.Min(50,message.Length)))))).ToString());

            return notification;
        }

        /// <summary>
        /// Maak een tile notificatie met daarin een teller met het aantal nieuwe berichten
        /// </summary>
        /// <param name="count">Aantal nieuwe berichten</param>
        /// <returns>Notificatie met de tile en een tellertje van het aantal nieuwe berichten</returns>
        public static Notification PrepareTile(int count)
        {
            Notification notification = new Notification();
            notification.Type = NotificationType.Tile;
            
            XNamespace wp = "WPNotification";

            notification.Data = Encoding.UTF8.GetBytes(
                new XDocument(
                    new XDeclaration("1.0", "utf-8", "true")
                    , new XElement(wp + "Notification"
                        , new XElement(wp + "Tile"
                            , new XElement(wp + "BackgroundImage", "/Background.png")
                            , new XElement(wp + "Count", count)
                            , new XElement(wp + "Title", "My Social Hub")))).ToString());

            return notification;
        }

        /// <summary>
        /// Maak een notificatie met een eigen payload
        /// </summary>
        /// <param name="content">Waarde</param>
        /// <returns>Notificatie met daarin de waarde</returns>
        public static Notification PrepareRaw(String content)
        {
            Notification notification = new Notification();
            notification.Type = NotificationType.Raw;
            notification.Data = Encoding.UTF8.GetBytes(content);

            return notification;
        }
    }
}
